www.gusucode.com > VC++ 可自定义窗体模式(可以精简显示、隐藏菜单栏等)-源 > VC++ 可自定义窗体模式(可以精简显示、隐藏菜单栏等)-源码程序/code/MainFrm.cpp

    // MainFrm.cpp : implementation of the CMainFrame class
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "ViewModeSDI.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	ON_WM_CREATE()

	ON_COMMAND( IDI_TOOLBAR_EXIT   , OnExit    )
	ON_COMMAND( IDI_TOOLBAR_NORMAL , OnNormal  )
	ON_COMMAND( IDI_TOOLBAR_SIMPLE , OnSimple  )
	ON_COMMAND( IDI_TOOLBAR_COMPACT, OnCompact )
	ON_COMMAND( IDI_TOOLBAR_HELP   , OnHelp    )

	ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_NORMAL,  OnUpdateNormalUI  )
	ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_SIMPLE,  OnUpdateSimpleUI  )
	ON_UPDATE_COMMAND_UI( IDI_TOOLBAR_COMPACT, OnUpdateCompactUI )
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	m_nViewMode = E_VIEWMODE_NORMAL;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	m_menuMainWnd.LoadMenu( IDR_MAINFRAME );

	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if ( ! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		! m_wndToolBar.LoadToolBar( IDR_TOOLBAR_BMP ) )
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	CImageList	imageList;
	CBitmap		bitmap;

	bitmap.LoadBitmap( IDR_TOOLBAR_BMP );
	imageList.Create( 16, 16, ILC_COLORDDB, 5, 0 );
	m_wndToolBar.GetToolBarCtrl().SetImageList( & imageList );
	imageList.Detach();
	bitmap.Detach();

	m_wndToolBar.GetToolBarCtrl().SetButtonWidth( 72, 72 );
	m_imageListToolBar.Create( 72, 72, ILC_COLOR32, 5, 0 );
	m_imageListToolBar.SetBkColor( GetSysColor( COLOR_BTNFACE ) );
	m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_EXIT    ) );
	m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_NORMAL  ) );
	m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_COMPACT ) );
	m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_SIMPLE  ) );
	m_imageListToolBar.Add( AfxGetApp()->LoadIcon( IDI_TOOLBAR_HELP    ) );

	m_wndToolBar.GetToolBarCtrl().SetHotImageList( & m_imageListToolBar );
	m_wndToolBar.GetToolBarCtrl().SetImageList( & m_imageListToolBar );

	CRect rectToolBar;
	m_wndToolBar.GetItemRect( 0, & rectToolBar );
 	m_wndToolBar.SetSizes( rectToolBar.Size(), CSize( 72, 72 ) );
	m_imageListToolBar.Detach();

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );
	EnableDocking( CBRS_ALIGN_ANY );
	DockControlBar( & m_wndToolBar );

	GetWindowRect( & m_rectWindow );
	GetClientRect( & m_rectClient );

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style &= ~FWS_ADDTOTITLE;
	cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );

	if ( cs.hMenu != NULL )
	{
		DestroyMenu( cs.hMenu );
		cs.hMenu = NULL;
	}

	if( ! CFrameWnd::PreCreateWindow( cs ) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

void CMainFrame::OnNormal()
{
	m_nViewMode = E_VIEWMODE_NORMAL;
	ViewMode( m_nViewMode );
}

void CMainFrame::OnUpdateNormalUI( CCmdUI* pCmdUI )
{
	pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_NORMAL );
}

void CMainFrame::OnSimple()
{
	m_nViewMode = E_VIEWMODE_SIMPLE;
	ViewMode( m_nViewMode );
}

void CMainFrame::OnUpdateSimpleUI( CCmdUI* pCmdUI )
{
	pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_SIMPLE );
}

void CMainFrame::OnCompact()
{
	m_nViewMode = E_VIEWMODE_COMPACT;
	ViewMode( m_nViewMode );
}

void CMainFrame::OnUpdateCompactUI( CCmdUI* pCmdUI )
{
	pCmdUI->SetRadio( m_nViewMode == E_VIEWMODE_COMPACT );
}

void CMainFrame::OnExit()
{
	PostQuitMessage( NULL );
}

void CMainFrame::OnHelp()
{
	( ( CViewModeSDIApp* ) AfxGetApp() )->OnAppAbout();
}

VOID CMainFrame::ViewMode( INT nViewModeID )
{
	CRect rectWindow;
	CRect rectClient;
	CRect rectToolBar;
	CRect rectStatusBar;

	rectWindow = m_rectWindow;
	rectClient = m_rectClient;
	m_wndToolBar.GetWindowRect( & rectToolBar );

	CStatusBar* pStatus = ( CStatusBar* ) AfxGetApp()->m_pMainWnd->GetDescendantWindow( AFX_IDW_STATUS_BAR );	
	pStatus->GetWindowRect( & rectStatusBar );

	int nHeightBorder  = GetSystemMetrics( SM_CYBORDER  );
	int nHeightCaption = GetSystemMetrics( SM_CYCAPTION );

	int cx = 0;
	int cy = 0;

	switch ( nViewModeID )
	{
	case E_VIEWMODE_NORMAL:
		SetMenu( & m_menuMainWnd );
		pStatus->ShowWindow( SW_SHOW );

		cx = rectWindow.Width();
		cy = rectWindow.Height();
		break;

	case E_VIEWMODE_SIMPLE:
		SetMenu( & m_menuMainWnd );
		pStatus->ShowWindow( SW_HIDE );

		cx = rectWindow.Width();
		cy = rectWindow.Height() - rectClient.Height() + rectToolBar.Height() + nHeightCaption - nHeightBorder;
		break;

	case E_VIEWMODE_COMPACT:
		SetMenu( NULL );
		pStatus->ShowWindow( SW_HIDE );

		cx = rectWindow.Width();
		cy = nHeightCaption + rectToolBar.Height() + nHeightBorder * 2;
		break;

	default:
		return;
	}

	SetWindowPos( & wndTop, rectWindow.left, rectWindow.top, cx, cy, SWP_SHOWWINDOW );  
}